#ifndef xpack_macro_private_xstruct_concept
#define xpack_macro_private_xstruct_concept
#pragma push_macro("xuser")
#undef  xuser
#define xuser mixc::macro_private_xstruct_concept
#include"define/base_type.hpp"
#include"macro/xforward.hpp"
#include"meta/is_ref.hpp"
#include"meta/remove_ref.hpp"
#include"meta_seq/tlist.hpp"
#pragma pop_macro("xuser")

template<class __base_t, class __item_t>
concept __can_prop_assign = requires(__base_t prop, __item_t && value){
    prop = xforward(value);
};

template<class __left_t, class __right_t>
concept __can_cmp_eq = requires(__left_t left, __right_t right){ left == right; };

template<class __left_t, class __right_t>
concept __can_cmp_ne = requires(__left_t left, __right_t right){ left != right; };

template<class __left_t, class __right_t>
concept __can_cmp_gt = requires(__left_t left, __right_t right){ left > right; };

template<class __left_t, class __right_t>
concept __can_cmp_ge = requires(__left_t left, __right_t right){ left >= right; };

template<class __left_t, class __right_t>
concept __can_cmp_lt = requires(__left_t left, __right_t right){ left < right; };

template<class __left_t, class __right_t>
concept __can_cmp_le = requires(__left_t left, __right_t right){ left <= right; };

template<class __random_access_t, class __index_t>
concept __can_random_access = requires(__random_access_t list, __index_t && index){ list[xforward(index)]; };

template<class __prop_t>
concept __can_operator_this = requires(__prop_t object){ object.operator->(); };

template<class __prop_t>
concept __is_prop = mixc::macro_private_xstruct_concept::remove_ref<__prop_t>::__prop::value == true;

template<class type>
concept __xstruct_is_ref = mixc::macro_private_xstruct_concept::is_ref<type>;

#endif